package test.video.play;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.net.Uri;
import android.os.Bundle;
import android.sax.RootElement;
import android.text.AndroidCharacter;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;

public class VideoPlayActivity extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{

	private static final String TAG = "MediaPlayerDemo";
	private int mVideoWidth;
	private int mVideoHeight;
	private MediaPlayer mMediaPlayer;
	private SurfaceView mPreview;
	private SurfaceHolder holder;
	private String path = "C:/Users/bhanu/Documents/flash-swf-converter/aftershock_1.mp4";
	private Bundle extras;
	private static final String MEDIA = "media";
	private static final int LOCAL_AUDIO = 1;
	private static final int STREAM_AUDIO = 2;
	private static final int RESOURCES_AUDIO = 3;
	private static final int LOCAL_VIDEO = 4;
	private static final int STREAM_VIDEO = 5;
	private boolean mIsVideoSizeKnown = false;
	private boolean mIsVideoReadyToBePlayed = false;
	
	@Override
	public void onCreate(Bundle icicle) {
		
		super.onCreate(icicle);
		setContentView(R.layout.mediaplaye);
		System.setProperty("ro.kernel.qemu", "1");
		mPreview = (SurfaceView) findViewById(R.id.surface);
		holder = mPreview.getHolder();
		holder.addCallback(this);
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		extras = getIntent().getExtras(); 
	
	}
	
	private void playVideo(Integer Media) {
		doCleanUp();
		try {
		    switch (Media) {
		        case LOCAL_VIDEO:
		           
		        	System.out.println("Hey there");
		            //path = "C:/Users/bhanu/Desktop/sample_video_playback/747.3gp";
		        	//path = "/sdcard/1939_512kb.mp4";
		        	//path = "/sdcard/amplification_1.3gp";
		        	//path = "/sdcard/747.3gp";
		        	path = "/sdcard/divergent_1.mp4";
		        	if (path == "") {
		            	System.out.println("Hey there: Inside if path");
		                // Tell the user to provide a media file URL.
		                Toast.makeText(VideoPlayActivity.this,
		                                "Please edit MediaPlayerDemo_Video Activity, "
		                                        + "and set the path variable to your media file path."
		                                        + " Your media file must be stored on sdcard.",
		                                Toast.LENGTH_LONG).show();
		
		            }
		            break;
		        case STREAM_VIDEO:
		            /*
		             * TODO: Set path variable to progressive streamable mp4 or
		             * 3gpp format URL. Http protocol should be used.
		             * Mediaplayer can only play "progressive streamable
		             * contents" which basically means: 1. the movie atom has to
		             * precede all the media data atoms. 2. The clip has to be
		             * reasonably interleaved.
		             * 
		             */
		        	System.out.println("Hey there: STREAM_VIDEO");
		            path = "";
		            if (path == "") {
		                // Tell the user to provide a media file URL.
		                Toast.makeText(VideoPlayActivity.this,
		                                "Please edit MediaPlayerDemo_Video Activity,"
		                                        + " and set the path variable to your media file URL.",
		                                Toast.LENGTH_LONG).show();
		
		            }
		
		            break;		
		    }
		    // Create a new media player and set the listeners
		    mMediaPlayer = new MediaPlayer();
		    mMediaPlayer.setDataSource(path);
		    mMediaPlayer.setDisplay(holder);
		    mMediaPlayer.prepareAsync();
		    mMediaPlayer.setOnBufferingUpdateListener(this);
		    mMediaPlayer.setOnCompletionListener(this);
		    mMediaPlayer.setOnPreparedListener(this);
		    mMediaPlayer.setOnVideoSizeChangedListener(this);
		    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
		
		
		} catch (Exception e) {
		    Log.e(TAG, "error: " + e.getMessage(), e);
		}
	}
	
	public void onBufferingUpdate(MediaPlayer arg0, int percent) {
		Log.d(TAG, "onBufferingUpdate percent:" + percent);
	}
	
	public void onCompletion(MediaPlayer arg0) {
		Log.d(TAG, "onCompletion called");
	}
	
	public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
		Log.v(TAG, "onVideoSizeChanged called");
		if (width == 0 || height == 0) {
		    Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
		    return;
		}
		mIsVideoSizeKnown = true;
		mVideoWidth = width;
		mVideoHeight = height;
		if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
		    startVideoPlayback();
		}
	}
	
	public void onPrepared(MediaPlayer mediaplayer) {
		Log.d(TAG, "onPrepared called");
		mIsVideoReadyToBePlayed = true;
		if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
		    startVideoPlayback();
		}
	}
	
	public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
		Log.d(TAG, "surfaceChanged called");
	
	}
	
	public void surfaceDestroyed(SurfaceHolder surfaceholder) {
		Log.d(TAG, "surfaceDestroyed called");
	}
	
	
	public void surfaceCreated(SurfaceHolder holder) {
		Log.d(TAG, "surfaceCreated called");
		//playVideo(extras.getInt(MEDIA));
		playVideo(4);
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		releaseMediaPlayer();
		doCleanUp();
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		releaseMediaPlayer();
		doCleanUp();
	}
	
	private void releaseMediaPlayer() {
		if (mMediaPlayer != null) {
		    mMediaPlayer.release();
		    mMediaPlayer = null;
		}
	}
	
	private void doCleanUp() {
		mVideoWidth = 0;
		mVideoHeight = 0;
		mIsVideoReadyToBePlayed = false;
		mIsVideoSizeKnown = false;
	}
	
	private void startVideoPlayback() {
		Log.v(TAG, "startVideoPlayback");
		holder.setFixedSize(mVideoWidth, mVideoHeight);
		mMediaPlayer.start();
	} 
}